package ponteiro;

import static org.junit.Assert.*;
import static ponteiro.Ponteiro.*;

import org.junit.*;

public class PonteiroTest {

	public static class Teste {
		String string;

		public Teste(String string) {
			super();
			this.string = string;
		}
	}

	@Test
	public void testPonteiroNormal() throws Exception {
		Teste teste = new Teste("1");

		// Teste *ponteiro = &teste;
		Ponteiro<Teste> ponteiro = getPonteiro(teste);

		// Teste objeto = *ponteiro;
		Teste objeto = ponteiro.getObjeto();
		assertEquals(teste, objeto);
	}

	@Test
	public void testPonteiroDePonteiro() throws Exception {
		Teste teste = new Teste("2");

		// Teste *aux = &teste;
		// Teste **ponteiro = &aux;
		Ponteiro<Ponteiro<Teste>> ponteiro = getPonteiro(getPonteiro(teste));

		// Teste objeto = **ponteiro;
		Teste objeto = ponteiro.getObjeto().getObjeto();
		assertEquals(teste, objeto);
	}

	@Test
	public void testPonteiroAritmetica() throws Exception {
		Teste[] testeArray = new Teste[3];
		testeArray[0] = new Teste("0");
		testeArray[1] = new Teste("1");
		testeArray[2] = new Teste("2");
		Teste[] testeArray2 = new Teste[3];

		// Teste *ponteiro = testeArray;
		Ponteiro<Teste> ponteiro = getPonteiro(testeArray);
		// testeArray2[0] = *ponteiro;
		testeArray2[0] = ponteiro.getObjeto();

		// ponteiro++;
		ponteiro.adiciona(1);
		// testeArray2[1] = *ponteiro;
		testeArray2[1] = ponteiro.getObjeto();

		// ponteiro++;
		ponteiro.adiciona(1);
		// testeArray2[2] = *ponteiro;
		testeArray2[2] = ponteiro.getObjeto();

		assertArrayEquals(testeArray, testeArray2);
	}

}
